
/**
 *  new
 *  描述：new 运算符允许开发人员创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
 * https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new
 */

function Person(name) {
  this.name = name
}
let person1 = new Person('lili')



function myNew(constructor, ...args) {
  // 创建一个对象
  let obj = {};
  // 构造函数的prototype属性
  let prototype = constructor.prototype;

  // 设置对象原型
  Object.setPrototypeOf(obj, prototype);

  //  执行构造函数，利用apply修改this执行
  let result = constructor.apply(prototype, args);
  
  // 如果构造函数返回一个对象，则返回该对象，否则返回新创建的对象
  return typeof result === 'object' && result !== null ? result : obj

}